function S = dsolve(eqs, conds)
    % S = dsolve(eq)
    % S = dsolve(eq, conds)
    % S = dsolve(eqs, conds)
    % 求解常微分方程组，eqs是符号等式（sp.Eq）或其组成的元胞数组，fn是需要求解的函数符号或其组成的元胞数组，conds是求解的初值条件，是符号等式（要求左边是替换对应求解符号函数的表达式，右边是具体的值）。
    % 例子：
    %% 求解一阶微分方程
    % Input [1] >> a = syms('a'); f = sym('f(t)');
    % Input [2] >> eq = symeq(f.diff(t), a*f);
    % Input [3] >> dsolve(eq)
    % Eq(f(t), C1*exp(a*t))
    %% 加上处置条件：
    % Input [4] >> dsolve(eq, symeq(f.subs(t, 0), 5))
    % Eq(f(t), 5*exp(a*t))
    %% 求解二阶微分方程：
    % Input [5] >> eq = symeq(f.diff(t, 2), a*f);
    % Input [6] >> dsolve(eq)
    % Eq(f(t), C1*exp(-sqrt(a)*t) + C2*exp(sqrt(a)*t))
    %% 加上两个初值条件：
    % Input [7] >> df = f.diff(t);
    % Input [8] >> dsolve(eq, {symeq(f.subs(t, 0), 0), symeq(df.subs(t, 0), 1)})
    % Eq(f(t), exp(sqrt(a)*t)/(2*sqrt(a)) - exp(-sqrt(a)*t)/(2*sqrt(a)))
    %% 求解二元常微分方程组：
    % Input [9] >> y = sym('y(t)'); z = sym('z(t)');
    % Input [10] eq1 = symeq(y.diff(t), z);
    % Input [11] eq2 = symeq(z.diff(t), -y);
    % Input [12] dsolve({eq1,eq2})
    % 此时会返回 Python 列表：
    % [Eq(y(t), C1*sin(t) + C2*cos(t)), Eq(z(t), C1*cos(t) - C2*sin(t))] 
    if iscell(eqs)
        eqs = pylist(eqs{:});
    end
    py = pyroot();
    sp = sympy_sp();
    if nargin == 1
        S = sp.dsolve(eqs);
    elseif nargin == 2
        if ~iscell(conds)
            conds = {conds};
        end
        ics = py.dict();
        for i = 1:length(conds)
            tmp = conds{i};
            ics{tmp.lhs} = tmp.rhs;
        end
        S = sp.dsolve(eqs, pyargs('ics', ics));
    end
end